//============================================================================
// Nombre		: IUC.cpp
// Materia		: Organizacion de Datos (75.06) - FIUBA
// Catedra		: AZCURRA-GUTIERREZ-SANTOS
// Autor		: Tkaczyszyn, Muszalski, Gallinal, Fernandez
// Descripcion	: TPDatos , Ansi-style
//============================================================================

#include <iostream>
#include "../cute/cute.h"
#include "../cute/ide_listener.h"
#include "../cute/cute_runner.h"
#include "ModuloAlmacenamiento/GeneradorIUC.h"
#include "ModuloAlmacenamiento/Correo.h"
#include "ModuloAlmacenamiento/ArchivadorCorreo.h"
#include "ModuloAlmacenamiento/DireccionDeCorreo.h"
#include "ModuloAlmacenamiento/ManejadorArchivo.h"
#include "ModuloAlmacenamiento/Bloque.h"
//#include "ModuloAlmacenamiento/Mailcito.h"
#include <fstream>

using namespace std;


typedef struct{
	int x;
	int y;
}Prueba;


void testCantidadDeBytesAsuntoMetadata()
{
	GeneradorIUC* genIuc = GeneradorIUC::getInstancia();

	Correo* correo = new Correo();

	DireccionDeCorreo* origen = new DireccionDeCorreo((char *)"nico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.com");

	correo->iuc = genIuc->generarNuevoIUC();
	correo->fecha=(char *)"121120102034";
	correo->origen = origen;
	correo->asunto = (char *)"Prueba obtener metadata";
	correo->mensaje = (char *)"lalalala";

	cout<< correo->asunto;
	cout<< correo->origen->direccion;

	ArchivadorCorreo* archivadorCorreo = new ArchivadorCorreo();
	archivadorCorreo->GuardarCorreo(correo);



}

void testGeneradorIUC()
{
	GeneradorIUC* genIuc = GeneradorIUC::getInstancia();
	IUC* iucAux;
	int maximo = 1000;

	//se generan iucs a modo de testeo:
	for(int i=0;i<maximo;i++)
			iucAux = genIuc->generarNuevoIUC();

	ASSERTM("Se generaron UICs", genIuc->getUltimoIUC()->getId()==iucAux->getId());
	//ASSERTM("Se generaron UICs", genIuc->getUltimoIUC()->getId()=="0000");//pueba de falla
}

//TODO ver que pasa cuando se Recupera una estructura y despues se itenta volver a escribir.
void testManejadorArchivo()
{
	Prueba* p;
	fstream arc;

	p->x = 20;
	p->y = 35;
/*
	ASSERTM("Archivo creado",ManejadorArchivo::Crear("prueba.dat", &arc));
	ASSERTM("Escribe arc binario al final",	ManejadorArchivo::EscribirEstructura(&arc, p, sizeof(Prueba)));
	ASSERTM("Escribe arc binario al final",	ManejadorArchivo::EscribirEstructura(&arc, p, sizeof(Prueba)));
	ASSERTM("Escribe arc binario al final",	ManejadorArchivo::EscribirEstructura(&arc, p, sizeof(Prueba)));
	ASSERTM("Escribe arc binario con offset",ManejadorArchivo::EscribirEstructura(&arc, p, 20, sizeof(Prueba)));
	ASSERTM("Escribe arc binario al final",	ManejadorArchivo::EscribirEstructura(&arc, p, sizeof(Prueba)));
	ASSERTM("Escribe arc bytes", ManejadorArchivo::EscribirBytes(&arc, (char*) "hola mundo!"));
	ASSERTM("Escribe arc bytes con offset",ManejadorArchivo::EscribirBytes(&arc, (char*)"planeta", 50 , 7));
	ASSERTM("Lee un registro",	(((Prueba*)ManejadorArchivo::RecuperarEstructura(&arc,2, sizeof(Prueba)))!= NULL));
	ASSERTM("Cierra archivo",
	Correo* correo = new Correo();

	DireccionDeCorreo* origen = new DireccionDeCorreo((char *)"nico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.com");

	correo->iuc = genIuc->generarNuevoIUC();
	correo->fecha=(char *)"121120102034";
	correo->origen = origen;
	correo->asunto = (char *)"Prueba obtener metadata";
	correo->mensaje = (char *)"lalalala";

	cout<< correo->asunto;
	cout<< correo->origen->direccion;

	ArchivadorCorreo* archivadorCorreo = new ArchivadorCorreo();
	archivadorCorreo->GuardarCorreo(correo);

	ManejadorArchivo::Cerrar("prueba.dat", &arc)== true);
	*/


}

/*
void runGeneradorIUC()
{
	cute::suite s;

	s.push_back(CUTE(testGeneradorIUC));
	cute::ide_listener lis;
	cute::makeRunner(lis)(s, "Prueba Unitaria - GeneradorIUC");

}

void runArchivadorCorreoTests()
{
	cute::suite s;

	s.push_back(CUTE(testCantidadDeBytesAsuntoMetadata));
	cute::ide_listener lis;
	cute::makeRunner(lis)(s, "Prueba Unitaria - ArchivadorCorreo");
}

void runManejadorArchivo()
{
	cute::suite s;

	s.push_back(CUTE(testManejadorArchivo));
	cute::ide_listener lis;
	cute::makeRunner(lis)(s, "Prueba Unitaria - ManejadorArchivo");

}
*/

int main(){

//	Mailcito unMailcito = new Mailcito();

//	char* mailSerializado = unMailcito->getMailSerializado();

	char* mailSerializado = "111122222222222204000440010AAAABBBBCCCCDDDDDDDDDD";

	cout << "Iniciando Bloquecitos.. Get Ready.." << endl;

	cout << "Mail Serializado:" << endl;

	cout << mailSerializado << endl << endl;

	fstream archivo;

	cout << "Creando Archivo..." << endl;

	ManejadorArchivo::Crear("Blokes.dat", &archivo);

	cout << "Creando Bloque..." << endl;

	Bloque* unBloque = new Bloque(0,500,mailSerializado,&archivo);

	cout << "**************" << endl;
	cout << "BLOQUE CREADO" << endl;
	cout << "**************" << endl;

	unBloque->setMemoria("Memoria del Bloque:");


	cout << unBloque->getMemoria() << endl;

	/*unBloque->setMemoria("Hola, soy la memoria.");
	cout << unBloque->getMemoria();*/


	cout << "FIN DEL PROGRAMA" << endl << endl;

//	cout << unBloque->obtenerMail(666) << endl;


	cout << "********************************" << endl;
	cout << "******** ACA   EMPIEZA *********" << endl;
	cout << "*********** OTRA ***************" << endl;
	cout << "*********** PARTE **************" << endl;
	cout << "********************************" << endl << endl;
/*
	char* _memoria;
	int _numeroBloque = 0;
	int _tamanioBloque = 100;
	int _espacioLibre = 90;
	fstream* _archivo;


	char* memoria = new char[_tamanioBloque];

	for (int i = 0; i < _tamanioBloque; i++){
		memoria[i] = '0';
	}

	cout << "Memoria llenas con A:" << endl;
	cout << memoria << endl << endl;

	//stringstream ios(ios_base::in| ios_base::out| ios_base::binary);
	int offset = (_numeroBloque * _tamanioBloque);


	int _espacioOcupado = _tamanioBloque - _espacioLibre;

	memcpy((memoria + _espacioOcupado),mailSerializado,strlen(mailSerializado));

	cout << "Mail serializado:" << endl;
	cout << mailSerializado << endl << endl;

	cout << "Memoria con Mail:" << endl;
	cout << memoria << endl;
/*
	stringstream ios(ios_base::in| ios_base::out| ios_base::binary);
	int offset = (numeroBloque * tamanioBloque);

	ios.write(this->getMemoria(),this->getTamanioBloque());
	return 	ManejadorArchivo::EscribirEstructura(this->getArchivo(), &ios,offset , this->getTamanioBloque());

*/

//	cout << unBloque->obtenerMail(1111) << endl;


	cout << "FIN" << endl;
    return 0;

}


